AWS ParallelCluster Slurmが複数キュー(パーティション)に対応しました
AWS ParallelCluster がマルチキュー(パーティション)に対応
ジョブスケジューラーのSlurmでは、コンピュートノードをパーティションとして単位でグルーピングでき、ジョブ投入時に実行するパーティションを指定することができます。
AWS ParallelClusterのジョブスケジューラー 2.9 以降で Slurm を指定すると、複数のパーティションを作成できるようになった上、パーティションに使用するインスタンスタイプを柔軟に指定できるようになりました。
この機能を利用すると、1クラスター内に C 系インスタンスで構成されれる CPU 系パーティションと G4 系インスタンスで構成される GPU 系パーティションを構成できます。
同じことを従来の AWS ParallelCluster で実現しようとすると、CPU系、GPU系それぞれでクラスターを構築する必要がありました。
マルチキュー機能は、ヘッドノードを集約して複数パーティション運用したいケースやオンプレで複数パーティション運用されているSlurmクラスターをそのまま AWS に lift and shift(リホスト)したいケースに適用できます。
ドキュメントのChange Log から引用します。
Added support for multiple queues and multiple instance types in the compute fleet when used with Slurm Workload Manager. When using queues, Auto Scaling groups are no longer used on Slurm. An Amazon Route 53 hosted zone is now created with the cluster and is used for DNS resolution of compute nodes when the Slurm scheduler is used. For more information, see Multiple queue mode.
設定ファイルの変更
従来のシングルキュー向けの設定方法は有効です。
その上で、マルチキューを利用したい場合、は コンピュートノード情報やクラスターの組み方を
- queue
- compute_resource
セクションに分割します。
マルチキューに関連する設定項目と記述するセクションの対応関係は次の表の通りです。
項目 | シングル | マルチ | 例 |
---|---|---|---|
queue_settings | N.A. | cluster | q1, q2 |
compute_resource_settings | N.A. | queue | i1,i2 |
placement_group | cluster | queue | DYNAMIC |
enable_efa | cluster | queue | TRUE |
disable_hyperthreading | cluster | queue | FALSE |
compute_type | cluster | queue | spot |
instance_type | cluster | compute_resource | c5.xlarge |
min_count | cluster | compute_resource | 0 |
initial_count | cluster | compute_resource | 1 |
max_count | cluster | compute_resource | 10 |
spot_price | cluster | compute_resource | 0.5 |
cluster : queue は 1:M、 queue : compute_resource は N:M の関係です。
やってみた
- c5.xlarge インスタンスを利用した CPU キュー
- g4.xlarge インスタンスを利用した GPU キュー
の2つのキューがあるクラスターを実際に構築します。
設定ファイル
次の様な設定ファイルを用意し、 $ pcluster crate test -c multi.conf
を実行します。
パラメーター(特にVPC関連)は適宜読み替えてください。
[aws] aws_region_name = ap-northeast-1 [global] cluster_template = default [cluster default] key_name = xxx base_os = alinux2 scheduler = slurm vpc_settings = dev master_instance_type = c5.xlarge s3_read_write_resource = * queue_settings = cpu, gpu [vpc dev] vpc_id = vpc-123 master_subnet_id = subnet-123 compute_subnet_id = subnet-123 [queue cpu] compute_resource_settings = cpu placement_group = DYNAMIC disable_hyperthreading = true compute_type = spot [queue gpu] compute_resource_settings = gpu placement_group = DYNAMIC disable_hyperthreading = false [compute_resource cpu] instance_type = c5.xlarge min_count = 1 initial_count = 1 max_count = 2 [compute_resource gpu] instance_type = g4dn.xlarge min_count = 1 initial_count = 1 max_count = 2
クラスターを確認
クラスターの構築完了後、Slurm コマンドでクラスターを確認します。
sinfo
$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST cpu* up infinite 1 idle# cpu-dy-c5xlarge-1 cpu* up infinite 1 idle cpu-st-c5xlarge-1 gpu up infinite 1 idle~ gpu-dy-g4dnxlarge-1 gpu up infinite 1 idle gpu-st-g4dnxlarge-1
PARTITION 列は cpu と gpu の2種類があります。
シングルキューのときの PARTITION は compute 固定でした。
$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST compute* up infinite 3 mix ip-10-1-21-[30,95,179]
scontrol
$ scontrol show partition PartitionName=cpu AllowGroups=ALL AllowAccounts=ALL AllowQos=ALL AllocNodes=ALL Default=YES QoS=N/A DefaultTime=NONE DisableRootJobs=NO ExclusiveUser=NO GraceTime=0 Hidden=NO MaxNodes=UNLIMITED MaxTime=UNLIMITED MinNodes=0 LLN=NO MaxCPUsPerNode=UNLIMITED Nodes=cpu-st-c5xlarge-[1-1],cpu-dy-c5xlarge-[1-1] PriorityJobFactor=1 PriorityTier=1 RootOnly=NO ReqResv=NO OverSubscribe=NO OverTimeLimit=NONE PreemptMode=OFF State=UP TotalCPUs=4 TotalNodes=2 SelectTypeParameters=NONE JobDefaults=(null) DefMemPerNode=UNLIMITED MaxMemPerNode=UNLIMITED PartitionName=gpu AllowGroups=ALL AllowAccounts=ALL AllowQos=ALL AllocNodes=ALL Default=NO QoS=N/A DefaultTime=NONE DisableRootJobs=NO ExclusiveUser=NO GraceTime=0 Hidden=NO MaxNodes=UNLIMITED MaxTime=UNLIMITED MinNodes=0 LLN=NO MaxCPUsPerNode=UNLIMITED Nodes=gpu-st-g4dnxlarge-[1-1],gpu-dy-g4dnxlarge-[1-1] PriorityJobFactor=1 PriorityTier=1 RootOnly=NO ReqResv=NO OverSubscribe=NO OverTimeLimit=NONE PreemptMode=OFF State=UP TotalCPUs=8 TotalNodes=2 SelectTypeParameters=NONE JobDefaults=(null) DefMemPerNode=UNLIMITED MaxMemPerNode=UNLIMITED
キュー(パーティション)を指定してジョブを実行
Slurm では、ジョブ実行時にキューを指定できます。
srun
の場合は --partition
引数にパーティション名を指定します。
$ srun --partition gpu -l hostname 0: gpu-st-g4dnxlarge-1 $ srun --partition cpu -l hostname 0: cpu-dy-c5xlarge-1
それぞれのパーティションで実行できていますね。
制約
マルチプルキューモードには以下の制限があります。
- AWS ParallelCluster 2.9 以降に対応
- ジョブスケジューラー : Slurm のみ
- queue の最大数 : 5
- queue を構成する compute_resource の最大数 : 3
- 各 compute_resource のインスタンスタイプは異なること
最後に
AWS parallelCluster 2.9 の Slurm マルチキューモードを利用すると、CPU・GPUのようにワークロードの種類ごとにキューを分けたり、キューを複数のインスタンスタイプで構成することができます。
Slurmでは様々な背景により複数のキューを運用しているケースが多々あるので、オンプレに近い構成のままAWS ParallelClusterに移植(リホスト)できる選択肢ができたのは喜ばしいことではないかと思います。
AWS parallelCluster にはマルチキュー以外にも様々なアップデートがあります。詳細はチェンジログをご確認ください。